import { defineStore } from 'pinia';

import { getAuthInfo } from '@/api/authorization';
import { profile as profileApi } from '@/api/identity';
import type { ErrorMessageMode } from '#/request';

/** 授权状态 */
interface AuthState {
  /**
   * 授权类型，role-角色授权、code-权限码授权。
   * @default 'code'
   */
  type: 'code' | 'role';
  /** 权限代码 */
  accessCodes: string[];
  /** 角色 */
  roleCodes: string[];
}

/** 初始状态 */
const initState: AuthState = {
  type: 'code',
  accessCodes: [],
  roleCodes: [],
};

/** 授权存储 */
export const useAuthStore = defineStore(
  'app-auth',
  () => {
    /** 权限状态信息 */
    const state = ref<AuthState>({ ...initState });

    /** 获取授权类型 */
    const getAuthType = computed(() => unref(state).type);
    /** 获取权限代码 */
    const getAccessCodes = computed(() => unref(state).accessCodes);
    /** 获取角色代码 */
    const getRoleCodes = computed(() => unref(state).roleCodes);

    /** 设置授权类型 */
    const setAuthType = (type: 'code' | 'role') => {
      state.value = { ...state.value, type };
    };
    /** 设置权限代码 */
    const setAccessCodes = (codes: string[]) => {
      state.value = { ...state.value, accessCodes: codes };
    };
    /** 设置角色代码  */
    const setRoleCodes = (codes: string[]) => {
      state.value = { ...state.value, roleCodes: codes };
    };

    /** 刷新 */
    const refresh = async (roles?: string[], mode: ErrorMessageMode = 'none') => {
      // 授权信息
      try {
        const codes = await getAuthInfo(mode);
        setAccessCodes(codes?.map((m) => `${m}`) || []);
      } catch (error) {
        console.error(error);
      }
      // 角色信息
      if (!roles) {
        try {
          const userInfo = await profileApi(mode);
          roles = userInfo?.Roles?.map((m) => `${m.Id}`) || [];
        } catch (error) {
          console.error(error);
        }
      }
      setRoleCodes(roles);
    };

    /** 重置 */
    const reset = () => {
      state.value = { ...initState };
    };

    return {
      /** 权限状态信息 */
      state,
      /** 获取授权类型 */
      getAuthType,
      /** 获取权限代码 */
      getAccessCodes,
      /** 获取角色代码 */
      getRoleCodes,
      /** 设置授权类型 */
      setAuthType,
      /** 设置权限代码 */
      setAccessCodes,
      /** 设置角色代码 */
      setRoleCodes,
      /** 刷新 */
      refresh,
      /** 重置 */
      reset,
    };
  },
  {
    persist: false, // 如果需要持久化就写 true, 不需要持久化就写 false（或者去掉这个配置项）。
  },
);
